4

时间:2017年04月07日

说明:本文部分内容均摘取自书籍《Linux命令行与shell脚本编程大全》,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第四章学习总结

第四章:更多的bash shell命令

本章内容:

管理进程
获取磁盘统计信息
挂载新磁盘
排序数据
归档数据

4.1 监测程序

Linux系统管理员面临的最复杂的任务之一就是跟踪运行在系统中的程序,尤其是现在,图形化桌面集成了大量的应用来生成一个完整的桌面环境。系统中总是运行着大量的程序。

4.1.1 探查进程

当程序运行在系统上时,我们称之为进程。想监测这些进程,需要熟悉ps命令的用法。

命令:ps

命令格式:ps
命令说明:ps命令只会显示运行在当前控制台下的属于当前用户的进程。
    基本输出显示了程序的进程ID(ProcessID,PID)、它们运行在哪个终端(TTY)以及进程已用CPU时间。

Linux系统中使用的GNU ps命令支持3中不同类型的命令行参数:

Unix风格的参数,前面加单破折线(-)
BSD风格的参数,前面不加破折线()
GNU风格的参数,前面加双破折线(--)

1.Unix风格的参数

Unix风格的参数是从贝尔实验室开发的AT&T Unix系统上原有的ps命令继承下来的。这些命令如下:

-A:显示所有进程
-N:显示与指定参数不符的所有进程
-a:显示除控制进程和无终端进程外的所有进程
-d:显示除控制进程外的所有进程
-e:显示所有进程
-C cmdlist:显示包含在cmdlist列表中的进程
-G grplist:显示包含在grplist列表中的进程
-U userlist:显示属主的用户ID在userlist列表中的进程
-g grplist:显示会话或组ID在grplist列表中的进程
-p pidlist:显示PID在pidlist列表中的进程
-s sesslist:显示会话ID在sesslist列表中的进程
-t ttylist:显示终端ID在ttylist列表中的进程
-u userlist:显示有效用户ID在userlist列表中的进程
-F:现在更多额外输出(相对于-f参数而言)
-O format:显示默认的输出列以及format列表指定的特定列
-M:显示进程的安全信息
-c:显示进程的额外调度器信息
-f:显示完整格式的输出
-j:显示任务信息
-l:显示长列表
-o format:仅显示由format指定的列
-y:不要显示进程标记(process flag,表明进程状态的标记)
-Z:显示安全标签信息
-H:用层级格式来显示进程(树状,用来显示父进程)
-n namelist:定义了WCHAN列显示的值
-w:采用宽输出模式,不限款度显示
-L:显示进程中的线程
-V:显示ps命令的版本号

使用ps命令的关键不在于记住所有可用的参数,而在于记住最有用的哪些参数。

例如你想查看系统上运行的所有进程,可用ps -ef命令。ps命令允许你像这样把参数组合在一起。-e参数指定显示所有运行在系统上的进程;-f参数则扩展了输出,这些扩展的列包含了有用的信息。

如下:

UID:启动这些进程的用户
PID:进程的进程ID
PPID:父进程的进程号(如果该进程是由另一个进程启动的)
C:进程生命周期中的CPU利用率
STIME:进程启动时的系统时间
TTY:进程启动时的终端设备
TIME:运行进程需要的累计CPU时间
CMD:启动的程序名称

如果想要获得更多的信息,可采用-l参数,它会生产一个长格式输出。注意使用了-l参数之后多出的那些列:

F:内核分配给进程的系统标记
S:进程的状态
--O:代表正在运行
--S:代表正在休眠
--R:代表可运行,正等待运行
--Z:代表僵化,进程已结束但父进程已不存在
--T:代表停止
PRI:进程的优先级(越大的数字代表越低的优先级)
NI:谦让度值用来参与决定优先级
ADDR:进程的内存地址
SZ:假如进程被换出,所需交换空间的大致大小
WCHAN:进程休眠的内核函数的地址

2.BSD风格的参数

伯克利软件发行版(Berkeley software distribution,BSD)是加州大学伯克利分校开发的一个Unix版本。它和AT&T Unix系统有许多细小的不同。BSD版的ps命令参数如下:

T:显示跟当前终端关联的所有进程
a:显示跟任意终端关联的所有进程
g:显示所有的进程,包括控制进程
r:仅显示运行中的进程
x:显示所有的进程,甚至包括未分配任何终端的进程
U userlist:显示归userlist列表中某用户ID所有的进程
p pidlist:显示PID在pidlist列表中的进程
t ttylist:显示所关联的终端在ttylist列表中的进程
O format:除了默认输出的列之外,还输出由format指定的列
X:按过去的Linux i386寄存器格式显示
Z:将安全信息添加到输出中
j:显示任务信息
l:采用长模式
o format:仅显示由format指定的列
s:采用信息格式显示
u:采用基于用户的格式显示
v:采用虚拟内存格式显示
N namelist:定义在WCHAN列中使用的值
O order:定义显示信息列的顺序
S:将数值信息从子进程加到父进程上,比如CPU和内存的使用情况
c:显示真实的命令名称(用以启动进程的程序名称)
e:显示命令使用的环境变量
f:用分层格式来显示进程,表名哪些进程启动了哪些进程
h:不显示头信息
k sort:指定用以将输出排序的列
n:和ECHAN信息一起显示出来,用数值来表示用户ID和组ID
w:为较宽屏幕显示宽输出
H:将线程按进程来显示
m:在进程后显示线程
L:列出所有格式指定符
V:显示ps命令的版本号

在使用BSD参数时,ps命令会自动改变输出以模仿BSD格式。使用ps l命令,其中大部分的输出结果列跟使用Unix风格参数时的输出是一样的,只有一小部分不同。如下:

VSZ:进程在内存中的大小,以千字节(KB)为单位
RSS:进程在未换出时占用的物理内存
STAT:代表当前进程状态的双字符状态码

许多系统管理员都喜欢BSD风格的l参数。它能输出更详细的进程状态码(STAT列)。第一个字符采用了和Unix风格s列相同的值,表明进程是在休眠、运行还是等待。第二个参数进一步说明进程的状态。第二个参数说明:

<:该进程运行在高优先级上
N:该进程运行在低优先级上
L:该进程有页面锁定在内存中
s:该进程是控制进行
l:该进程是多线程的
+:该进程运行在前台

3.GNU长参数

GNU开发人员在这个新改进过的ps命令中加入了另外一些参数。其中一些GNU长参数复制了现有的Unix或BSD类型的参数,而另一些则提供了新功能。现有的GNU长参数如下:

--deselect:显示所有进程,命令行中列出的进程
--Gruop grplist:显示组ID在grplist列表中的进程
--User userlist:显示用户ID在userlist列表中的进程
--group grplist:显示有效组ID在grplist列表中的进程
--pid pidlist:显示PID在pidlist列表中的进程
--ppid pidlist:显示父PID在pidlist列表中的进程
--sid sidlist:显示会话ID在sidlist列表中的进程
--tty ttylist:显示终端设备号在ttylist列表中的进程
--user userlist:显示有效用户ID在userlist列表中的进程
--format format:仅显示有format指定的列
--context:显示额外的安全信息
--cols n:将屏幕宽度设置为n列
--columns n:将屏幕宽度设置为n列
--cunulative:包含已停止的子进程的信息
--forest:用层级结构显示出进程和父进程之间的关系
--headers:在每页输出中都显示列的头
--no-headers:不显示列的头
--lines n:将屏幕高度设为n行
--rows n:将屏幕高度设为n排
--sort order:指定将输出按哪列排序
--width n:将屏幕宽度设为n列
--help:显示帮助信息
--info:显示调试信息
--version:显示ps命令的版本号

可以将GNU长参数和Unix或BSD风格的参数混合用来定制输出。GNU长参数中一个着实让人喜爱的功能就是--forest参数。它会显示进程的层级信息,并用ASCII字符绘出可爱的图表。这种格式让跟踪子进程和父进程变得十分容易。

4.1.2 实时监测进程

ps命令虽然在收集运行在系统上的进程信息时非常有用,但也有不足之处:它只能显示某个特定时间点的信息。如果想观察那些频繁换进换出的内存的进程趋势,用ps命令就不方便了。而top命令刚好适用这种情况。

命令:top

命令格式:top
命令说明:top命令跟ps命令相似,能够显示进程信息,但它是实时显示的。
注意:按q键退出。

top显示分为两部分:第一部分为系统总体概况;第二部分为进程详细列表。

第一部分:系统总体概况

第一行显示了当前时间、系统运行时间、登录的用户数以及系统的平均负载。
--平均负载有三个值:最近1分钟的、最近5分钟的和最近15分钟的平均负载。
--值越大说明系统的负载越高。
--如果近15分钟内的平均负载都很高,就说明系统可能有问题。
--通常,如果系统的负载值超过了2,就说明系统比较繁忙了。
第二行显示了进程概要信息,top命令的输出中将进程叫作任务(task):有多少进程处在运行、休眠、停止或是僵化状态(僵化状态是指进程完成了,但父进程没有响应)。
第三行显示了CPU的概要信息。top根据进程的属主(用户还是系统)和进程的状态(运行、空闲还是等待)将CPU利用率分成几类输出。
第四行说的是系统的物理内存:总共有多少内存,当前用了多少,还有多少空闲。
第五行显示的也是系统的物理内存,不过是针对系统交换空间(如果分配了的话)的状态而言的。

第二部分:进程详细列表

第二部分显示了当前运行中的进程的详细列表,有些列跟ps命令的输出类似。具体如下:

PID:进程的PID
USER:进程属主的名字
PR:进程的优先级
NI:进程的谦让度值
VIRT:进程占用的虚拟内存总量
RES:进程占用的物理内存总量
SHR:进程和其他进程共享的内存总量
S:进程的状态
--D:代表可中断的休眠状态
--R:代表在运行状态
--S:代表休眠状态
--Z:代表僵化状态
--T:代表停止或跟踪状态
%CPU:进程使用的CPU时间比例
%MEM:进程使用的内存占可用内存的比例
TIME+:自进程启动到目前为止的CPU时间总量
COMMAND:进程所对应的命令行名称,也就是启动的程序名

4.1.3 结束进程

在Linux中,进程之前通过信号来通信。进程的信号就是预定义好的一个消息,进程能识别它并决定忽略还是做出反应。进程如何处理信号是由开发人员通过编程来决定的。这些信号如下:

信号:名称:描述
1:HUB:挂起
2:INT:中断
3:QUIT:结束运行
9:KILL:无条件终止
11:SEGV:段错误
15:TERM:尽可能终止
17:STOP:无条件停止运行,但不终止
18:TSTP:停止或暂停,但继续在后台运行
19:CONT:在STOP或TSTP之后恢复执行

在Linux上有两个命令可以向运行中的进程发出进程信号。

1.kill命令

要发送进程信号,你必须是进程的属主或登录为root用户。
命令:kill

命令格式:kill PID
命令说明:默认情况下,kill命令会向命令行中列出的PID出送一个TERM信号。TERM信号告诉进程尽可能的话就停止运行。不过有时候进程通常会忽略这个请求。
命令演示:kill 3940
演示说明:尽可能的终止PID为3940的进程。

命令格式:kill -s 信号名或信号值 PID
命令说明:如果要强制终止,-s参数支持指定其他信号(用信号名或信息值)。
命令演示:kill -9 3490
演示说明:强制无条件终止PID为3490的进程。提示:要检查kill命令是否有效,可再运行ps或top命令,看看问题进程是否已停止。

2.killall命令

killall命令非常强大,它支持通过进程名而不是PID来结束进程。killall命令也支持通配符,这在系统因负载过大而变得很慢时很有用。
命令:killall

命令演示:killall http*
演示说明:上例中的命令结束了所有以http开头的进程,比如Apcahe Web服务器的httpd服务。

警告:以root用户身份登录系统时,使用killall命令要特别小心,因为很容易就会误用通配符而结束了重要的系统进程。这可能会破坏文件系统。

4.2 监测磁盘空间

4.2.1 挂载存储媒体

在今天的图形化桌面环境里,大多数Linux发行版都能自动挂载特定类型的可移动存储媒体。

1.mount命令

Linux上用来挂载媒体的命令叫作mount。默认情况下,mount命令会输出当前系统上挂载的设备列表。mount命令提供如下四部分信息:

媒体的设备文件名
媒体挂载到虚拟目录的挂载点
文件系统类型
已挂载媒体的访问状态

Linux可以识别非常多的文件系统类型。如果是和Windows PC共用这些存储设备,通过得使用以下文件系统类型:

vfat:Windows长文件系统
ntfs:Windows NT、XP、Vista以及Windows7中广泛使用的高级文件系统
iso9660:标准CD-ROM文件系统

命令:mount

命令格式:mount -t type device directory
命令说明:type参数指定了磁盘被格式化的文件系统类型。后面两个参数定义了该存储设备的设备文件的位置以及挂载在虚拟目录中的位置。
命令演示:mount -t vfat /dev/sdb1 /media/disk
演示说明:手动将U盘/dev/sdb1挂载到/media/disk。

要手动在虚拟目录中挂载设备,需要以root用户身份登录,或是以root用户身份运行sudo命令。媒体挂载到了虚拟目录后,root用户就有了该设备的所有访问权限,而其他用户的访问则会被限制。你可以通过目录权限(将在第七章介绍)指定用户对设备的访问权限。

如果要用到mount命令的一些高级功能,可用参数如下:

-a:挂载/etc/fstab文件中指定的所有文件系统
-f:使mount命令模拟挂载设备,但并不真的挂载
-F:和-a参数一起使用时,会同时挂载所有文件系统
-v:详细模式,将会说明挂载设备的每一步
-I:i:不启用任何/sbin/mount.filesystem下的文件系统帮助文件
-l:L:给ext2、ext3和XFS文件系统自动添加文件系统标签
-n:挂载设备,但不注册到/etc/mtab已挂账设备文件中
-p num:进行加密挂载时,从文件描述符num中获得密码短语
-s:忽略该文件系统不支持的挂载选项
-r:将设备挂载为只读的
-w:将设备挂载为可读写的(默认参数)
-L label:将设备按指定的label挂载
-U uuid:将设备按指定的uuid挂载
-O:和-a参数一起使用,限制命令只作用到特定的一组文件系统上
-o:给文件系统添加特定的选项

-o参数允许在挂载文件系统时添加一些逗号分隔的额外选项。以下为常用的选项:

ro:以只读形式挂载
rw:以读写形式挂载
user:允许普通用户挂载文件系统
check=none:挂载文件系统时不进行完整性校验
loop:挂载一个文件

2.umount命令

从Linux系统上移除一个可移动设备时,不能直接从系统上移除,而应该先卸载。

窍门:Linux上不能直接弹出已挂载的CD。如果你在从光驱中移除CD时遇到麻烦,通常是因为该CD还挂载在虚拟目录里。先卸载它,然后再去尝试弹出。

命令:umount

命令格式:umount [ directory | device ]
命令说明:卸载设备。如果有任何程序正在使用设备上的文件,系统就不会允许你卸载它。

4.2.2 使用df命令

命令:df

命令格式:df
命令说明:df命令会显示有数据的已挂载文件系统。

命令输出如下:

设备的设备文件位置
能容纳多少个1024字节大小的块
已用了多少个1024字节大小的块
还有多少个1024字节大小的块可用
已用空间所占的比例
设备挂载到了哪个挂载点上

使用-h参数,使输出结果可读。

命令格式:df -h
命令说明:按照用户已读的形式显示,通常用M来替代兆字节,用G替代吉字节。

4.2.3 使用du命令

命令:du

命令格式:du
命令说明:du命令可以显示某个特定目录的磁盘使用情况。默认情况下,会显示当前目录下所有的文件、目录的磁盘使用情况。

du命令常用的参数:

-c:显示所有已列出文件总大小。
-h:按用户易读的格式输出大小。
-s:显示每个输出参数的总计。

4.3 处理数据文件

4.3.1 排序处理

命令:sort

命令格式:sort file
命令说明:sort命令会按照会话指定的默认语言的排序规则对文本文件中的数据进行排序。

一些常用的sort参数:

-b:排序时忽略起始的空白
-C:不排序,如果数据无序也不要报告
-c:不排序,但检查输入数据是不是已排序;未排序的话,报告
-d:仅考虑空白和字母,不考虑特殊字符
-f:默认情况下,会将大写字母排在前面;这个参数会忽略大小写
-g:按通用数字来排序
-i:在排序时忽略不可打印字符
-M:用三字符月份名按月份排序
-m:将两个已排序数据文件合并
-n:按字符串数值来排序
-o:将排序结果写出到指定的文件中
-R:按随机生成的散列表的键值排序
-r:反序排序
-S:指定使用的内存大小
-s:禁用最后重排序比较
-T:指定一个位置来存储临时工作文件
-t:指定一个用来区分键位置的字符
-u:和-c参数一起使用时,检查严格排序;不和-c参数一起使用时,仅输出第一例相似的两会
-z:用NULL字符作为行尾,而不是用换行符

4.3.2 搜索数据

命令:grep

命令格式:grep [options] pattern [file]
命令说明:grep命令行会在输入或指定的文件中查找包含匹配指定模式的字符的行。
命令演示:grep three file
命令说明:在file文件中查找包含three的行。

grep命令比较常用的参数:

-v:进行反向搜索
-n:显示匹配模式的行所在的行号
-c:显示有多少行含有匹配的模式
-e:指定多个匹配模式,默认显示含有多个匹配模式的所有行

grep的匹配模式支持使用正则表达式。将在第二十章介绍正则表达式。

4.3.3 压缩数据

Linux包含了多种文件压缩工具。虽然听上去不错,但这实际上经常会在用户下载文件时造成混淆。
以下是Linux上的文件压缩工具:

工具:文件扩展名:描述
bzip2:.bz2:采用Burrows-Wheeler块排序文件压缩算法和霍夫曼编码
compress:.Z:最初的Unix文件压缩工具,已经快没人用了
gzip:.gz:GNU压缩工具,用Lempel-Ziv编码
zip:.zip:Windows上PKZIP工具的Unix实现

gzip是Linux上最流行的压缩工具。gzip是GNU项目的产物,包含以下工具:

gzip:用来压缩文件
gzcat:用来查看压缩过的文本文件的内容
gunzip:用来解压文件

命令:gzip

命令格式:gzip 文件
命令说明:对指定文件进行压缩
命令演示:gzip demo.sh
演示说明:压缩demo.sh文件

命令:gunzip

命令格式:gunzip文件
命令说明:对指定文件进行解压
命令演示:gzip gunzip.sh.gz
演示说明:解压demo.sh压缩文件

4.3.4 归档数据

tar命令的功能:

-A:将一个已有tar归档文件追加到另一个已有tar归档文件
-c:创建一个新的tar归档文件
-d:检查归档文件和文件系统的不同之处
-r:追加文件到已有tar归档
-t:列出已有tar归档文件的内容
-u:将此tar归档文件中已有的同名文件新的文件追加到该tar归档文件中
-x:从已有tar归档文件中提取文件

tar命令选项:

-C dir:切换到指定目录
-f file:输出结果到文件或设备file
-j:将输出结果重定向给bzip2命令来压缩内容
-p:保留所有文件权限
-v:在处理文件时显示文件
-z:将输出重定向给gzip命令来压缩内容

命令:tar

命令格式:tar function [options] object1 object2 ...
命令说明:将文件object1和object2等待归档到一个tar文件中。
命令演示:tar -cvf test.tar test/ test2/
演示说明:创建了名为test.tar的归档文件,含有test和test2目录内容。

命令格式:tar -xvf 文件
命令说明:从tar文件中提取文件。

命令格式: tar zcvf demo.tar.gz demo【推荐使用】
命令说明:将文件夹压缩为.tar.gz文件。

命令格式:tar zxvf  demo.tar.gz
命令说明:将压缩文件解压。

窍门:下载了开源软件之后,你会经常看到文件名以。tgz结尾。这些是gzip压缩过的tar文件可以用命令tar -zxvf filename.tgz来解压。

4.4 小结

本章讨论了Linux系统管理员和程序员用到的一些高级bash命令。主要介绍了ps、top、kill、killall、mount、umount、df、du、sort、grep、gzip、gzcat、gunzip、tar命令。

本章学习命令个人总结如下:

ps:查看系统进程相关信息
top:实时监测系统进程相关信息
kill:通过PID结束单个进程
killall:通过进程名或通配符来结束多个进程
mount:挂载存储媒体,如:U盘,CD等
umount:卸载存储媒体
df:查看磁盘的使用情况
du:查看目录或文件的大小
sort:对文本文件的内容进行排序
grep:搜索数据,在输入或指定的文件中查找包含匹配指定模式的字符的行
gzip:压缩文件
gzcat:查看压缩过的文本文件的内容
gunzip:解压文件
tar:归档数据,能够对文件和目录进行压缩和解压缩

妙手空空
1.3k 声望370 粉丝

博观而约取,厚积而薄发